// 核心代码模式
//    计算机中的负数是以其补码形式存在的 补码=原码取反+1。
//负数补码为最高位置1
class Solution {
public:
     int  NumberOf1(int n) {
         //法一 检查二进制每一位数字 移位操作
         //每次将第i位元素移动到末尾 跟1相与操作 计数
         int res = 0;
         for(int i=0;i<32;i++){
             res+= (n>>i) & 1;
         }
         return res;
         //不要只通过 >> 运算符进行操作，
         //因为负数的右移操作会在数字最左端补 1 ，
         //导致 n 始终不为0，造成无限循环。


         //法二 位运算 n&(n-1) 可以使最右边的1变0
         //循环变了多少次就多少个1
         int resu = 0;
         //for (初始条件;判断条件真执行循环体;执行完循环体再执行的语句)
         while(n){
             n &= n-1;
             resu++;
         }
         return resu;

     }
};